/*
 * UFixedPacketQueue.h
 *
 *  Created on: 2021年4月15日
 *      Author: chuan
 */

#ifndef UFIXEDPACKETQUEUE_H_
#define UFIXEDPACKETQUEUE_H_

#include "UMediaPacket.h"
#include <functional>


class UFixedPacketQueuePrivate;


class DLLEXPORT UFixedPacketQueue
{
public:
    typedef std::function< void (UMediaPacket& pkt) >   PacketHandler;

public:
    UFixedPacketQueue();
    virtual ~UFixedPacketQueue();

    size_t size();

    bool empty();

    size_t push(UMediaPacket& packet);

    UMediaPacket pop();

    bool pop(UMediaPacket& packet);

    void clear();

    /**
     * 在指定时间内等待媒体包
     * 如果队列不空,立即返回true
     * @param ms    毫秒
     * @return true 表示队列有元素了
     */
    bool timedwait(int ms);

    /**
     * 如果队列为空, 等待, 并弹出头部元素
     * @param packet
     * @param ms
     * @return
     */
    bool pop(UMediaPacket& packet, int ms);

    /// 取消等待
    void cancelWait();

    /**
     * 获取媒体时长, 单位为微妙
     * @return
     */
    int64_t getDuration();

    /**
     * 删除队列前面的包, 直到视频关键帧
     * 如果队列中没有视频关键帧, 不做任何操作
     * @return 删除的包数量
     */
    size_t dropUntilKeyFrame();

    /**
     * 设置最大时长, 单位为毫秒
     * @param ms
     * @return
     */
	int setMaxClockDuration(int ms);

    /**
     * 获取物理时间时长, 单位为毫秒
     * @return
     */
    int64_t getClockDuration();

    /**
     * 保留最大时长, 单位为毫秒
     * @param duration
     * @return
     */
    int64_t reserve(int64_t duration);

    /**
     * 读取但不移除
     * @param handler
     * @return
     */
    size_t readAll(PacketHandler handler);

    /**
     * 启用事件通知
     * @param enabled
     */
    void enableEvent(bool enabled);

private:
    UFixedPacketQueuePrivate*   m_pimp;


};

#endif /* UFIXEDPACKETQUEUE_H_ */
